/*
  求二维数组最大最小值
  问题的描述
    如下几点所示
    a). 在n 行 n 列的二维整数数组中，按以下要求选出两个数。
    b). 首先从每行选出大数，再从选出 的 n 个大数中选出小数；
    c). 其次，从每行选出小数，再从选出的 n 个小数中选出大数。
  输入格式:
    第一行为一个正整数n(2 <= n <= 10), 表示二维整数数组的行数和列数都为n
    随后输入n行，每行有n个正整数, 每2个数之间用空格隔开, 这些数用来为n行n列的二维数组的元素赋值
  输出格式:
    共输出2行, 
    第一行为1个整数, 该整数的计算方法为:
        首先从二维整数数组的每一行中选出最大的数, 并从这n个最大的数中选出最小的整数;
    第二行为1个整数, 该整数的计算方法为:
        首先从二维整数数组的每一行中选出最小的数, 并从这n个最大的数中选出最大的整数;
  例子1:
    输入:
      5
      13  65  190 24  78
      66  81  25  33  517
      139 32  56  82  93
      55  593 72  123 11
      19  95  76  31  629
    输出:
      139
      32
  例子2:
    输入:
      2
      1093 523
      923  5290
    输出:
      1093
      923
*/
#include <iostream>

using namespace std;

int main(){
  int n;
  cin >> n;
  int a1[n][n] ={};
  int i;
  int y;
  int j;
  int x;
  int f;
  int n1;
  int z;
  int u;
  int n2;

  for (i = 0; i < n; i++){
    for (j = 0; j < n; j++){
      cin >> y;
      a1[i][j] = y;
      if ( j == 0){
        x = a1[i][j];
        u = a1[i][j];
      }else{
        if (a1[i][j] >= x){
          x = a1[i][j];
        }
        if (a1[i][j] <= u){
          u = a1 [i][j];
        }
      }

    }
    n1 = x;
    n2  = u;
    if (i == 0){
      f = n1;
      z = n2 ;
    }else {
      if (n1 < f){
        f = n1;
      }
      if (n2 > z){
        z = n2;
      }

    }
  }
  cout << f << endl << z;
  return 0;
}
